﻿2026-05-10T11:45:08.2319952Z ##[group]Run pnpm verify:phase-4
2026-05-10T11:45:08.2320312Z [36;1mpnpm verify:phase-4[0m
2026-05-10T11:45:08.2341908Z shell: /usr/bin/bash -e {0}
2026-05-10T11:45:08.2342178Z env:
2026-05-10T11:45:08.2342427Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-10T11:45:08.2342756Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-10T11:45:08.2342990Z   SKIP_TRACE_CHECK: 1
2026-05-10T11:45:08.2343374Z ##[endgroup]
2026-05-10T11:45:08.5361149Z 
2026-05-10T11:45:08.5361998Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-10T11:45:08.5362936Z > node scripts/verify-phase-4.mjs
2026-05-10T11:45:08.5363403Z 
2026-05-10T11:45:08.5687415Z 
2026-05-10T11:45:08.5687961Z === Workspace: typecheck ===
2026-05-10T11:45:08.5689002Z >>> pnpm -r typecheck
2026-05-10T11:45:08.8852642Z Scope: 5 of 6 workspace projects
2026-05-10T11:45:08.8907343Z packages/db typecheck$ tsc --noEmit
2026-05-10T11:45:08.8916557Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T11:45:11.4469521Z packages/game-logic typecheck: Done
2026-05-10T11:45:11.4502203Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T11:45:13.4859259Z packages/db typecheck: Done
2026-05-10T11:45:14.9047661Z packages/protocol typecheck: Done
2026-05-10T11:45:14.9055214Z apps/server typecheck$ tsc --noEmit
2026-05-10T11:45:14.9064453Z apps/client typecheck$ tsc --noEmit
2026-05-10T11:45:26.1464941Z apps/client typecheck: Done
2026-05-10T11:45:26.8703809Z apps/server typecheck: Done
2026-05-10T11:45:26.8799418Z 
2026-05-10T11:45:26.8800024Z === Lint: protocol-sync ===
2026-05-10T11:45:26.8800949Z >>> pnpm lint:protocol-sync
2026-05-10T11:45:27.1803400Z 
2026-05-10T11:45:27.1804467Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-10T11:45:27.1805694Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-10T11:45:27.1806403Z 
2026-05-10T11:45:27.2097355Z lint-protocol-sync: OK
2026-05-10T11:45:27.2211303Z 
2026-05-10T11:45:27.2211920Z === Lint: game-logic-purity ===
2026-05-10T11:45:27.2212699Z >>> pnpm lint:game-logic-purity
2026-05-10T11:45:27.5259016Z 
2026-05-10T11:45:27.5260154Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-10T11:45:27.5261443Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-10T11:45:27.5262152Z 
2026-05-10T11:45:27.5583222Z lint-game-logic-purity: OK (6 file(s) clean)
2026-05-10T11:45:27.5698686Z 
2026-05-10T11:45:27.5699337Z === Lint: better-auth-schema-sync ===
2026-05-10T11:45:27.5700205Z >>> pnpm lint:better-auth-schema-sync
2026-05-10T11:45:27.8727937Z 
2026-05-10T11:45:27.8729358Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-10T11:45:27.8733147Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-10T11:45:27.8733968Z 
2026-05-10T11:45:29.5309862Z lint-better-auth-schema-sync: OK
2026-05-10T11:45:29.5428630Z 
2026-05-10T11:45:29.5429192Z === Lint: rate-limit-budgets ===
2026-05-10T11:45:29.5430107Z >>> pnpm lint:rate-limit-budgets
2026-05-10T11:45:29.8448543Z 
2026-05-10T11:45:29.8449863Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-10T11:45:29.8451344Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-10T11:45:29.8452061Z 
2026-05-10T11:45:29.8749456Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-10T11:45:29.8868693Z 
2026-05-10T11:45:29.8869241Z === Lint: no-clipboard-rce ===
2026-05-10T11:45:29.8869999Z >>> pnpm lint:no-clipboard-rce
2026-05-10T11:45:30.1871095Z 
2026-05-10T11:45:30.1872281Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-10T11:45:30.1873490Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-10T11:45:30.1874136Z 
2026-05-10T11:45:30.2192903Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-10T11:45:30.2307796Z 
2026-05-10T11:45:30.2308534Z === Lint: room-layout ===
2026-05-10T11:45:30.2309067Z >>> pnpm lint:room-layout
2026-05-10T11:45:30.5318765Z 
2026-05-10T11:45:30.5336032Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-10T11:45:30.5337022Z > node tools/scripts/lint-room-layout.mjs
2026-05-10T11:45:30.5338027Z 
2026-05-10T11:45:30.5669433Z lint-room-layout: OK
2026-05-10T11:45:30.5783903Z 
2026-05-10T11:45:30.5784377Z === ADR 0004 lint ===
2026-05-10T11:45:30.5785055Z >>> pnpm lint:adr:0004
2026-05-10T11:45:30.8808935Z 
2026-05-10T11:45:30.8819700Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-10T11:45:30.8824511Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-10T11:45:30.8828399Z 
2026-05-10T11:45:30.9095921Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T11:45:30.9206658Z 
2026-05-10T11:45:30.9207152Z === Drizzle: emit-check ===
2026-05-10T11:45:30.9208458Z >>> pnpm db:emit-check
2026-05-10T11:45:31.2229248Z 
2026-05-10T11:45:31.2230313Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-10T11:45:31.2233334Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-10T11:45:31.2235353Z 
2026-05-10T11:45:31.6679648Z No config path provided, using default 'drizzle.config.ts'
2026-05-10T11:45:31.6685446Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-10T11:45:32.0930577Z 8 tables
2026-05-10T11:45:32.0931547Z accounts 8 columns 1 indexes 0 fks
2026-05-10T11:45:32.0932455Z audit_log 6 columns 0 indexes 2 fks
2026-05-10T11:45:32.0935630Z characters 9 columns 0 indexes 1 fks
2026-05-10T11:45:32.0936533Z inventory_items 4 columns 0 indexes 1 fks
2026-05-10T11:45:32.0937519Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-10T11:45:32.0938849Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-10T11:45:32.0939787Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-10T11:45:32.0940568Z sessions 5 columns 0 indexes 1 fks
2026-05-10T11:45:32.0941100Z 
2026-05-10T11:45:32.0942311Z No schema changes, nothing to migrate 😴
2026-05-10T11:45:32.4240547Z 
2026-05-10T11:45:32.4241321Z === Drizzle: schema-sync ===
2026-05-10T11:45:32.4242223Z >>> pnpm lint:schema-sync
2026-05-10T11:45:32.7235950Z 
2026-05-10T11:45:32.7237038Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-10T11:45:32.7241039Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-10T11:45:32.7243741Z 
2026-05-10T11:45:32.7527261Z OK
2026-05-10T11:45:32.7647010Z 
2026-05-10T11:45:32.7647619Z === Drizzle: source-comments ===
2026-05-10T11:45:32.7648746Z >>> pnpm lint:source-comments
2026-05-10T11:45:33.0867930Z 
2026-05-10T11:45:33.0869257Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-10T11:45:33.0870726Z > pnpm -C packages/db run lint:source-comments
2026-05-10T11:45:33.0871432Z 
2026-05-10T11:45:33.3967851Z 
2026-05-10T11:45:33.3969247Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-10T11:45:33.3970708Z > node scripts/check-source-comments.mjs
2026-05-10T11:45:33.3971361Z 
2026-05-10T11:45:33.4268970Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-10T11:45:33.4474055Z 
2026-05-10T11:45:33.4474597Z === Workspace: test ===
2026-05-10T11:45:33.4475335Z >>> pnpm -r test
2026-05-10T11:45:33.7728691Z Scope: 5 of 6 workspace projects
2026-05-10T11:45:33.7783113Z packages/db test$ vitest run
2026-05-10T11:45:33.7792627Z packages/game-logic test$ vitest run
2026-05-10T11:45:34.2840364Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T11:45:34.2849753Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T11:45:34.6705122Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 32[2mms[22m[39m
2026-05-10T11:45:34.9233415Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T11:45:35.1630392Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T11:45:35.2896611Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T11:45:35.3851342Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:45:35.3952758Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T11:45:35.3954728Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T11:45:35.3956648Z packages/game-logic test: [2m   Start at [22m 11:45:34
2026-05-10T11:45:35.3958989Z packages/game-logic test: [2m   Duration [22m 1.09s[2m (transform 122ms, setup 0ms, import 205ms, tests 70ms, environment 1ms)[22m
2026-05-10T11:45:35.4529465Z packages/game-logic test: Done
2026-05-10T11:45:35.4548854Z packages/protocol test$ vitest run
2026-05-10T11:45:35.5275059Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:45:35.9568939Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T11:45:36.3552289Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-10T11:45:36.3554230Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T11:45:36.3567660Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T11:45:36.3570016Z packages/db test: [2m   Start at [22m 11:45:34
2026-05-10T11:45:36.3572307Z packages/db test: [2m   Duration [22m 2.04s[2m (transform 168ms, setup 0ms, import 1.42s, tests 31ms, environment 1ms)[22m
2026-05-10T11:45:36.3666082Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-10T11:45:36.3739136Z packages/db test: Done
2026-05-10T11:45:36.5285178Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T11:45:36.6931023Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T11:45:36.8649077Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T11:45:36.8657528Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T11:45:36.8706961Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T11:45:36.8709086Z packages/protocol test: [2m   Start at [22m 11:45:35
2026-05-10T11:45:36.8710981Z packages/protocol test: [2m   Duration [22m 917ms[2m (transform 152ms, setup 0ms, import 281ms, tests 38ms, environment 1ms)[22m
2026-05-10T11:45:36.8844538Z packages/protocol test: Done
2026-05-10T11:45:36.8850989Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T11:45:36.8853561Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T11:45:37.4630180Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T11:45:37.4632590Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T11:45:38.6322255Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 74[2mms[22m[39m
2026-05-10T11:45:38.9395703Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T11:45:38.9872814Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T11:45:38.9927524Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T11:45:39.0067188Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 167[2mms[22m[39m
2026-05-10T11:45:39.2545336Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 34[2mms[22m[39m
2026-05-10T11:45:39.5532653Z apps/server test: {"level":40,"time":1778413539548,"pid":3242,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T11:45:39.5583737Z apps/server test: {"level":40,"time":1778413539551,"pid":3242,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T11:45:39.5586103Z apps/server test: {"level":40,"time":1778413539552,"pid":3242,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T11:45:39.5591723Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-10T11:45:40.1760492Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-10T11:45:40.5046074Z apps/server test: {"level":30,"time":1778413540493,"pid":3253,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T11:45:40.5056527Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 724[2mms[22m[39m
2026-05-10T11:45:40.5087637Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 592[2mms[22m[39m
2026-05-10T11:45:41.4339977Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T11:45:41.4801409Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T11:45:41.4819844Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-ofgeGE/rebno.db
2026-05-10T11:45:41.4831194Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T11:45:41.4833422Z apps/server test: [run-migrations] OK
2026-05-10T11:45:41.4940484Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T11:45:41.4959402Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-CuNhpq/rebno.db
2026-05-10T11:45:41.4960839Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T11:45:41.4962834Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T11:45:41.4979017Z apps/server test: [run-migrations] OK
2026-05-10T11:45:41.5020102Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T11:45:41.5039385Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-qmJyBk/rebno.db
2026-05-10T11:45:41.5059310Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T11:45:41.5076045Z apps/server test: [run-migrations] OK
2026-05-10T11:45:41.5078581Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T11:45:41.5099377Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-qmJyBk/rebno.db
2026-05-10T11:45:41.5139301Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T11:45:41.5140755Z apps/server test: [run-migrations] OK
2026-05-10T11:45:41.5169877Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 54[2mms[22m[39m
2026-05-10T11:45:41.8340142Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-10T11:45:42.0696278Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T11:45:42.3497124Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T11:45:42.5808534Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T11:45:42.6329248Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 105[2mms[22m[39m
2026-05-10T11:45:43.4928372Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T11:45:43.4931876Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ override existing { override: true }
2026-05-10T11:45:43.4933742Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T11:45:43.9280066Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 116[2mms[22m[39m
2026-05-10T11:45:44.2394447Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T11:45:44.2459454Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T11:45:44.2479868Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T11:45:44.2518976Z apps/server test: [2m   Start at [22m 11:45:37
2026-05-10T11:45:44.2565691Z apps/server test: [2m   Duration [22m 6.78s[2m (transform 436ms, setup 0ms, import 3.46s, tests 979ms, environment 2ms)[22m
2026-05-10T11:45:44.2950423Z apps/server test: Done
2026-05-10T11:45:44.7535008Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T11:45:45.4859182Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 79[2mms[22m[39m
2026-05-10T11:45:46.1480776Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T11:45:46.8254144Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T11:45:47.4823881Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T11:45:48.1714225Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-10T11:45:48.8531732Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T11:45:49.5277583Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T11:45:50.2033476Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:45:50.8559455Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T11:45:51.5156135Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T11:45:51.5369784Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T11:45:51.5377242Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T11:45:51.5383254Z apps/client test: [2m   Start at [22m 11:45:37
2026-05-10T11:45:51.5385240Z apps/client test: [2m   Duration [22m 14.08s[2m (transform 564ms, setup 49ms, collect 868ms, tests 586ms, environment 8.08s, prepare 1.74s)[22m
2026-05-10T11:45:51.7274154Z apps/client test: Done
2026-05-10T11:45:51.7399909Z 
2026-05-10T11:45:51.7403576Z verify-phase-4: OK (12 steps green)
